package kgame5.k3d.core.obj3d.node3d.group3d {
import kgame5.k3d.core.obj3d.node3d.Group3D;
import kgame5.k3d.core.obj3d.node3d.Mesh3D;
import kgame5.k3d.core.obj3d.node3d.Node3D;
import kgame5.k3d.core.render.RenderSessionData;
import kgame5.k3d.core.render.layerrender.impl.BestGroup3DLayerRender;
import kgame5.k3d.core.render.layerrender.impl.zbuffer.ZBufferLayerRender;

import flash.display.Shape;

/**
 * @author kk
 * 这个是把child的那些face3D都融合到一起排列
 * !!注意这个要求所有在此组里的东西用的是同一张图片
 * 
 * 注意，这个里面只要有一个脏的，就会导致重绘.机制复杂啊
 * 
 * 注意，这个要求，必须子里有一个Mesh3D有bmd
 */
public class BestGroup3D extends Group3D{
	
	//_____________________Property_________________________
	
	//说自己是否是个融合的总容器,这个很重要
	private var isRoot:Boolean=true;		
	
	protected var mc:Shape;
	//______________________Method__________________________
	//p_sortLayer是是否参与排序,sortType是自己排序内部的东西
	//isRoot表示说他是否是个总结点，如果是总结点，则子的各个face都会会合到这里
	//zbufferWidht,zbufferHeight是否为-1是说是否使用zbuffer
	public function BestGroup3D(zbufferWidth:int=-1,zbufferHeight:int=-1){//sortType=2是ccz_bornID
		super();
		
		//是否使用zbuffer
		if(zbufferWidth==-1){
			renderer=new BestGroup3DLayerRender();	
		}else{
			renderer=new ZBufferLayerRender(zbufferWidth,zbufferHeight);
		}	
		
		mc=renderer.getDO() as Shape;
	}
	
	//如果BestGroup3D的父非BestGroup3D则,他是一个root,所有东西都绘制到这里
	override public function setParent(p:Group3D):void{
		
		super.setParent(p);
		
		if(p is BestGroup3D){//
			this.isRoot=false;
		}else{//父非BestGroup3D则，则这个BestGroup3D是根
			this.isRoot=true;
		}
	}
	
	//------针对child列表的操作
	override public function addChild(md:Node3D):void{
		//1,安全检查
		if((md is Mesh3D)||(md is BestGroup3D)){//Mesh3D或者是个BestGroup3D才可以
			
		}else{
			throw new Error("BeshGroup3D只能支持Mesh3D做为Child"+md);
		}
		
		//2,添加子
		super.addChild(md);
		
		//3,视图是不需要添加的
		//注意这个是不需要添加child的mc到我这里的，因为我是画在自己里的
		
	}
	
	//删除child.
	override public function removeChild(md:Node3D):void{
		//
		super.removeChild(md);
		//不需要操作视图
	}
	
	//--
	override public function Update(rsd:RenderSessionData,isParentDirty:Boolean):void{
		
		//--
		if(isVisible()==false){
			return ;
		}
		
		
		
		//--
		ti.calcMoc_Full(parentNode.ti.Mow,rsd.Mwc, rsd.isMwcDirty,isParentDirty);
		
		//--
		mc.visible=true;
		
		//--各个模型
		if(this.isRoot){
			renderer.aOuterFace=new Array();
		}
		
		var tempDirty:Boolean=this.ti.isNeedRedraw;//自己或者是自己的子，只要有一个脏的，就要重绘
		for each(var md:Node3D in aChild){
			md.renderer.aOuterFace=renderer.aOuterFace;//设置绘图层引用,为融合三角面而使用
			md.Update(rsd, this.ti.isNeedRedraw);//经过优化的更新方式,只能绕y轴旋转
			
			tempDirty=tempDirty|| md.ti.isNeedRedraw;
		}
		
		//注意这个很重要,这样上一级的bestGroup3D才能知道我是脏了
		this.ti.isNeedRedraw=tempDirty;
		
		//如果是总容器，则执行真正的绘制
		if(this.isRoot&&this.ti.isNeedRedraw){
			renderer.render(null,null,ti,rsd);
		}
	}
	
}//end of class
}